home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 June: Reference Library / Dev.CD Jun 95 / Dev.CD Jun 95.toast / What's New? / New System Software Extensions / QuickDraw 3D ß / Programming / Unsupported Libraries / Error_MesgLib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-06  |  12.4 KB  |  327 lines  |  [TEXT/MPS ]

  1. /******************************************************************************
  2.  **                                                                             **
  3.  **     Module:        Error_MesgLib.c                                             **
  4.  **                                                                          **
  5.  **                                                                          **
  6.  **     Purpose:                                                               **
  7.  **                                                                          **
  8.  **                                                                          **
  9.  **     Copyright (C) 1992, 1993 Apple Computer, Inc.  All rights reserved.     **
  10.  **                                                                          **
  11.  **                                                                          **
  12.  *****************************************************************************/
  13.  
  14. #include <assert.h>
  15. #include "QD3D.h"
  16. #include "QD3DErrors.h"
  17.  
  18. #include "Error_MesgLib.h"
  19.  
  20. typedef struct ErrorLookup {
  21.     struct ErrorLookup         *lookup;
  22.     long                    errorCode;
  23.     char                    *errorString;
  24. } ErrorLookup;
  25.  
  26. /*
  27.     To generate these tables, copy/paste the error codes from QD3DErrors.h
  28.     and use this regexp:
  29.     
  30.     Find:        EcError_([0-9A-z]*),
  31.     Replace:    NULL, EcError_\1, "EcError_\1",
  32.     
  33.     Find:        EcWarning_([0-9A-z]*),
  34.     Replace:    NULL, EcWarning_\1, "EcWarning_\1",
  35.     
  36.     Find:        EcNotice_([0-9A-z]*),
  37.     Replace:    NULL, EcNotice_\1, "EcNotice_\1",
  38.     
  39.     Don't forget to add NULL, 0, NULL at the end of each list
  40. */
  41.  
  42. static unsigned long    gNumErrors = 0;
  43. static ErrorLookup         gErrorLookup[] =
  44. {
  45.  
  46.     NULL, kQ3ErrorNone, "kQ3ErrorNone",        
  47.     /* Fatal Errors */
  48.     NULL, kQ3ErrorInternalError, "kQ3ErrorInternalError",
  49.     NULL, kQ3ErrorNoRecovery, "kQ3ErrorNoRecovery",                    /* TODO: This is not used correctly */
  50.     NULL, kQ3ErrorLastFatalError, "kQ3ErrorLastFatalError",
  51.     /* System Errors */
  52.     NULL, kQ3ErrorNotInitialized, "kQ3ErrorNotInitialized",
  53.     NULL, kQ3ErrorAlreadyInitialized, "kQ3ErrorAlreadyInitialized",
  54.     NULL, kQ3ErrorUnimplemented, "kQ3ErrorUnimplemented",
  55.     NULL, kQ3ErrorRegistrationFailed, "kQ3ErrorRegistrationFailed",
  56.     /* OS Errors */
  57.     NULL, kQ3ErrorUnixError, "kQ3ErrorUnixError",
  58.     NULL, kQ3ErrorMacintoshError, "kQ3ErrorMacintoshError",
  59.     NULL, kQ3ErrorX11Error, "kQ3ErrorX11Error",
  60.     /* Memory Errors */
  61.     NULL, kQ3ErrorMemoryLeak, "kQ3ErrorMemoryLeak",
  62.     NULL, kQ3ErrorOutOfMemory, "kQ3ErrorOutOfMemory",
  63.     /* Parameter errors */
  64.     NULL, kQ3ErrorNULLParameter, "kQ3ErrorNULLParameter",
  65.     NULL, kQ3ErrorParameterOutOfRange, "kQ3ErrorParameterOutOfRange",
  66.     NULL, kQ3ErrorInvalidParameter, "kQ3ErrorInvalidParameter",            /* TODO: Make this more specific */
  67.     NULL, kQ3ErrorInvalidData, "kQ3ErrorInvalidData",                /* TODO: Is this used? */
  68.     NULL, kQ3ErrorAcceleratorAlreadySet, "kQ3ErrorAcceleratorAlreadySet",        /* TODO: Is this used? */
  69.     NULL, kQ3ErrorVector3DNotUnitLength, "kQ3ErrorVector3DNotUnitLength",
  70.     /* Object Errors */
  71.     NULL, kQ3ErrorInvalidObject, "kQ3ErrorInvalidObject",
  72.     NULL, kQ3ErrorInvalidObjectClass, "kQ3ErrorInvalidObjectClass",
  73.     NULL, kQ3ErrorInvalidObjectType, "kQ3ErrorInvalidObjectType",
  74.     NULL, kQ3ErrorInvalidObjectName, "kQ3ErrorInvalidObjectName",
  75.     NULL, kQ3ErrorObjectClassInUse, "kQ3ErrorObjectClassInUse",            
  76.     NULL, kQ3ErrorAccessRestricted, "kQ3ErrorAccessRestricted",
  77.     NULL, kQ3ErrorMetaHandlerRequired, "kQ3ErrorMetaHandlerRequired",
  78.     NULL, kQ3ErrorNeedRequiredMethods, "kQ3ErrorNeedRequiredMethods",
  79.     NULL, kQ3ErrorNoSubClassType, "kQ3ErrorNoSubClassType",
  80.     NULL, kQ3ErrorUnknownElementType, "kQ3ErrorUnknownElementType",
  81.     /* Extension Errors */
  82.     NULL, kQ3ErrorNoExtensionsFolder, "kQ3ErrorNoExtensionsFolder",
  83.     NULL, kQ3ErrorExtensionError, "kQ3ErrorExtensionError",
  84.     NULL, kQ3ErrorPrivateExtensionError, "kQ3ErrorPrivateExtensionError",
  85.     /* Geometry Errors */
  86.     NULL, kQ3ErrorDegenerateGeometry, "kQ3ErrorDegenerateGeometry",
  87.     NULL, kQ3ErrorGeometryInsufficientNumberOfPoints, "kQ3ErrorGeometryInsufficientNumberOfPoints",
  88.     /* IO Errors */
  89.     NULL, kQ3ErrorEndOfFile, "kQ3ErrorEndOfFile",
  90.     NULL, kQ3ErrorInvalidMetafile, "kQ3ErrorInvalidMetafile",
  91.      NULL, kQ3ErrorInvalidMetafilePrimitive, "kQ3ErrorInvalidMetafilePrimitive",
  92.      NULL, kQ3ErrorInvalidMetafileLabel, "kQ3ErrorInvalidMetafileLabel",
  93.      NULL, kQ3ErrorInvalidMetafileObject, "kQ3ErrorInvalidMetafileObject",
  94.      NULL, kQ3ErrorInvalidMetafileSubObject, "kQ3ErrorInvalidMetafileSubObject",
  95.     NULL, kQ3ErrorInvalidSubObjectForObject, "kQ3ErrorInvalidSubObjectForObject",
  96.     NULL, kQ3ErrorUnresolvableReference, "kQ3ErrorUnresolvableReference",
  97.     NULL, kQ3ErrorUnknownObject, "kQ3ErrorUnknownObject",
  98.     NULL, kQ3ErrorStorageInUse, "kQ3ErrorStorageInUse",
  99.     NULL, kQ3ErrorStorageAlreadyOpen, "kQ3ErrorStorageAlreadyOpen",
  100.     NULL, kQ3ErrorStorageNotOpen, "kQ3ErrorStorageNotOpen",
  101.     NULL, kQ3ErrorStorageIsOpen, "kQ3ErrorStorageIsOpen",
  102.     NULL, kQ3ErrorFileAlreadyOpen, "kQ3ErrorFileAlreadyOpen",
  103.     NULL, kQ3ErrorFileNotOpen, "kQ3ErrorFileNotOpen",
  104.     NULL, kQ3ErrorFileIsOpen, "kQ3ErrorFileIsOpen",
  105.     NULL, kQ3ErrorBeginWriteAlreadyCalled, "kQ3ErrorBeginWriteAlreadyCalled",
  106.     NULL, kQ3ErrorBeginWriteNotCalled, "kQ3ErrorBeginWriteNotCalled",
  107.     NULL, kQ3ErrorEndWriteNotCalled, "kQ3ErrorEndWriteNotCalled",
  108.     NULL, kQ3ErrorReadStateInactive, "kQ3ErrorReadStateInactive",
  109.     NULL, kQ3ErrorStateUnavailable, "kQ3ErrorStateUnavailable",
  110.     NULL, kQ3ErrorWriteStateInactive, "kQ3ErrorWriteStateInactive",
  111.     NULL, kQ3ErrorSizeNotLongAligned, "kQ3ErrorSizeNotLongAligned",
  112.     NULL, kQ3ErrorFileModeRestriction, "kQ3ErrorFileModeRestriction",
  113.     NULL, kQ3ErrorInvalidHexString, "kQ3ErrorInvalidHexString",
  114.     NULL, kQ3ErrorWroteMoreThanSize, "kQ3ErrorWroteMoreThanSize",
  115.     NULL, kQ3ErrorWroteLessThanSize, "kQ3ErrorWroteLessThanSize",
  116.     NULL, kQ3ErrorReadLessThanSize, "kQ3ErrorReadLessThanSize",
  117.     NULL, kQ3ErrorReadMoreThanSize, "kQ3ErrorReadMoreThanSize",
  118.     NULL, kQ3ErrorSizeMismatch, "kQ3ErrorSizeMismatch",
  119.     NULL, kQ3ErrorStringExceedsMaximumLength, "kQ3ErrorStringExceedsMaximumLength",
  120.     NULL, kQ3ErrorValueExceedsMaximumSize, "kQ3ErrorValueExceedsMaximumSize",
  121.     NULL, kQ3ErrorNonUniqueLabel, "kQ3ErrorNonUniqueLabel",
  122.     /* View errors */
  123.     NULL, kQ3ErrorViewNotStarted, "kQ3ErrorViewNotStarted",
  124.     NULL, kQ3ErrorRendererNotSet, "kQ3ErrorRendererNotSet",
  125.     NULL, kQ3ErrorRenderingIsActive, "kQ3ErrorRenderingIsActive",
  126.     NULL, kQ3ErrorImmediateModeUnderflow, "kQ3ErrorImmediateModeUnderflow",
  127.     NULL, kQ3ErrorDisplayNotSet, "kQ3ErrorDisplayNotSet",
  128.     NULL, kQ3ErrorCameraNotSet, "kQ3ErrorCameraNotSet",
  129.     NULL, kQ3ErrorDrawContextNotSet, "kQ3ErrorDrawContextNotSet",
  130.     NULL, kQ3ErrorNonInvertibleMatrix, "kQ3ErrorNonInvertibleMatrix",
  131.     NULL, kQ3ErrorRenderingNotStarted, "kQ3ErrorRenderingNotStarted",
  132.     NULL, kQ3ErrorPickingNotStarted, "kQ3ErrorPickingNotStarted",
  133.     NULL, kQ3ErrorBoundsNotStarted, "kQ3ErrorBoundsNotStarted",
  134.     NULL, kQ3ErrorDataNotAvailable, "kQ3ErrorDataNotAvailable",
  135.     /* Renderer Errors */
  136.     NULL, kQ3ErrorUnknownStudioType, "kQ3ErrorUnknownStudioType",            /* TODO Name Change */
  137.     NULL, kQ3ErrorAlreadyRendering, "kQ3ErrorAlreadyRendering",
  138.     NULL, kQ3ErrorStartGroupRange, "kQ3ErrorStartGroupRange",
  139.     NULL, kQ3ErrorUnsupportedGeometryType, "kQ3ErrorUnsupportedGeometryType",
  140.     NULL, kQ3ErrorInvalidGeometryType, "kQ3ErrorInvalidGeometryType",
  141.     NULL, kQ3ErrorUnsupportedFunctionality, "kQ3ErrorUnsupportedFunctionality",
  142.     /* Group Errors */
  143.     NULL, kQ3ErrorInvalidPositionForGroup, "kQ3ErrorInvalidPositionForGroup",
  144.     NULL, kQ3ErrorInvalidObjectForGroup, "kQ3ErrorInvalidObjectForGroup",
  145.     NULL, kQ3ErrorInvalidObjectForPosition, "kQ3ErrorInvalidObjectForPosition",
  146.     /* Transform Errors */
  147.     NULL, kQ3ErrorScaleOfZero, "kQ3ErrorScaleOfZero",                /* Transform errors? */
  148.     /* String Errors */
  149.     NULL, kQ3ErrorBadStringType, "kQ3ErrorBadStringType",                /* What is this? */
  150.     /* Attribute Errors */
  151.     NULL, kQ3ErrorAttributeNotContained, "kQ3ErrorAttributeNotContained",        /* What is this? */
  152.     NULL, kQ3ErrorAttributeInvalidType, "kQ3ErrorAttributeInvalidType",        /* What is this? */
  153.     /* Camera Errors */
  154.     NULL, kQ3ErrorInvalidCameraValues, "kQ3ErrorInvalidCameraValues",        /* Redundant with NULL, kQ3ErrorParameterOutOfRange, "kQ3ErrorParameterOutOfRange" */
  155.     /* DrawContext Errors */
  156.     NULL, kQ3ErrorBadDrawContextType, "kQ3ErrorBadDrawContextType",
  157.     NULL, kQ3ErrorBadDrawContextFlag, "kQ3ErrorBadDrawContextFlag",
  158.     NULL, kQ3ErrorBadDrawContext, "kQ3ErrorBadDrawContext",
  159.     NULL, kQ3ErrorUnsupportedPixelDepth, "kQ3ErrorUnsupportedPixelDepth",
  160.     
  161.     NULL, 0, NULL
  162. };
  163.  
  164. static unsigned long    gNumWarnings = 0;
  165. static ErrorLookup         gWarningLookup[] =
  166. {
  167.  
  168.     NULL, kQ3WarningNone, "kQ3WarningNone",
  169.     /* General System */
  170.     NULL, kQ3WarningInternalException, "kQ3WarningInternalException",    
  171.     /* Object Warnings */
  172.     NULL, kQ3WarningNoObjectSupportForDuplicateMethod, "kQ3WarningNoObjectSupportForDuplicateMethod",
  173.     NULL, kQ3WarningNoObjectSupportForWriteMethod, "kQ3WarningNoObjectSupportForWriteMethod",
  174.     NULL, kQ3WarningNoObjectSupportForReadMethod, "kQ3WarningNoObjectSupportForReadMethod",
  175.     NULL, kQ3WarningNoObjectSupportForDrawMethod, "kQ3WarningNoObjectSupportForDrawMethod",
  176.     NULL, kQ3WarningUnknownElementType, "kQ3WarningUnknownElementType",
  177.     NULL, kQ3WarningTypeAndMethodAlreadyDefined, "kQ3WarningTypeAndMethodAlreadyDefined",
  178.     NULL, kQ3WarningTypeIsOutOfRange, "kQ3WarningTypeIsOutOfRange",
  179.     NULL, kQ3WarningTypeHasNotBeenRegistered, "kQ3WarningTypeHasNotBeenRegistered",
  180.     /* IO Warnings */
  181.     NULL, kQ3WarningFilePointerResolutionFailed, "kQ3WarningFilePointerResolutionFailed",
  182.     NULL, kQ3WarningStringExceedsMaximumLength, "kQ3WarningStringExceedsMaximumLength",
  183.     /* Memory Warnings */
  184.     NULL, kQ3WarningLowMemory, "kQ3WarningLowMemory",
  185.     NULL, kQ3WarningPossibleMemoryLeak, "kQ3WarningPossibleMemoryLeak",
  186.     /* View Warnings */
  187.     NULL, kQ3WarningViewTraversalInProgress, "kQ3WarningViewTraversalInProgress",
  188.     NULL, kQ3WarningNonInvertibleMatrix, "kQ3WarningNonInvertibleMatrix",
  189.     /* Quaternion Warning */
  190.     NULL, kQ3WarningQuaternionEntriesAreZero, "kQ3WarningQuaternionEntriesAreZero",
  191.     /* Renderer Warning */
  192.     NULL, kQ3WarningFunctionalityNotSupported, "kQ3WarningFunctionalityNotSupported",
  193.     
  194.     NULL, 0, NULL
  195. };
  196.  
  197. static unsigned long    gNumNotices = 0;
  198. static ErrorLookup         gNoticeLookup[] =
  199. {
  200.     NULL, kQ3NoticeNone, "kQ3NoticeNone",
  201.     NULL, kQ3NoticeDataAlreadyEmpty, "kQ3NoticeDataAlreadyEmpty",
  202.     /* General */
  203.     NULL, kQ3NoticeMethodNotSupported, "kQ3NoticeMethodNotSupported",
  204.     NULL, kQ3NoticeObjectAlreadySet, "kQ3NoticeObjectAlreadySet",
  205.     /* IO Notices */
  206.     NULL, kQ3NoticeFileAliasWasChanged, "kQ3NoticeFileAliasWasChanged",
  207.     /* Geometry */
  208.     NULL, kQ3NoticeMeshVertexHasNoComponent, "kQ3NoticeMeshVertexHasNoComponent",
  209.     NULL, kQ3NoticeMeshInvalidVertexFacePair, "kQ3NoticeMeshInvalidVertexFacePair",
  210.     NULL, kQ3NoticeMeshEdgeVertexDoNotCorrespond, "kQ3NoticeMeshEdgeVertexDoNotCorrespond",
  211.     NULL, kQ3NoticeMeshEdgeIsNotBoundary, "kQ3NoticeMeshEdgeIsNotBoundary",
  212.     /* Draw Context */
  213.     NULL, kQ3NoticeDrawContextNotSetUsingInternalDefaults, "kQ3NoticeDrawContextNotSetUsingInternalDefaults",
  214.     /* Lights */
  215.     NULL, EcNotice_InvalidAttenuationTypeUsingInternalDefaults, "EcNotice_InvalidAttenuationTypeUsingInternalDefaults",
  216.     
  217.     NULL, 0, NULL
  218. };
  219.  
  220. static unsigned long build_lookup(ErrorLookup *table);
  221. static char *lookup(ErrorLookup *table, unsigned long nElems, long errorCode);
  222.  
  223. static unsigned long build_lookup(ErrorLookup *table)
  224. {
  225.     unsigned long    total;
  226.     unsigned long    i, j;
  227.     TQ3Boolean        done;
  228.     
  229.     total = 0;
  230.     while (table[total].errorString != NULL) total++;
  231.     
  232.     /* Bubble sort (slow, but who cares? - you're screwing up anyway) */
  233.     
  234.     for (i = 0; i < total; i++)
  235.     {
  236.         table[i].lookup = &table[i];
  237.     }
  238.     
  239.     done = kQ3False;
  240.     
  241.     for (i = 0; i < total - 1; i++)
  242.     {
  243.         done = kQ3True;
  244.         
  245.         for (j = i + 1; j < total; j++)
  246.         {
  247.             if (table[i].errorCode > table[j].errorCode)
  248.             {
  249.                 ErrorLookup    *temp;
  250.                 
  251.                 temp = table[i].lookup;
  252.                 table[i].lookup = table[j].lookup;
  253.                 table[j].lookup = temp;
  254.                 done = kQ3False;
  255.             }
  256.         }
  257.         
  258.         if (done == kQ3True) break;
  259.     }
  260.     
  261.     return total;
  262. }            
  263.  
  264. static char *lookup(ErrorLookup *table, unsigned long nElems, long errorCode)
  265. {
  266.     long    highElem    = nElems - 1;
  267.     long    midElem        = highElem / 2;
  268.     long    lowElem        = 0;
  269.     long    direction    = 1;
  270.     static char notFound[100];
  271.         
  272.     while (    (highElem >= lowElem) &&
  273.             ((direction = (errorCode - table[midElem].errorCode))) != 0)
  274.     {
  275.         if (direction > 0)
  276.         {
  277.             lowElem = midElem + 1;
  278.         }
  279.         else
  280.         {
  281.             highElem = midElem - 1;
  282.         }
  283.         midElem = (highElem + lowElem) / 2;
  284.     }
  285.     
  286.     if (direction == 0)
  287.     {
  288. #ifdef debugging
  289.         assert(midElem <= nElems);
  290. #endif
  291.         return table[midElem].errorString;
  292.     }
  293.     else
  294.     {    
  295. #ifdef debugging
  296.         assert(lowElem <= nElems);
  297. #endif
  298.         sprintf(notFound, "Error (%ld) not found", errorCode);
  299.         return notFound;
  300.     }
  301. }
  302.  
  303.  
  304. char *getErrorString(long errorID)
  305. {
  306.     if (gNumErrors == 0)
  307.         gNumErrors = build_lookup(gErrorLookup);
  308.  
  309.     return lookup(gErrorLookup, gNumErrors, errorID);
  310. }
  311.  
  312. char *getWarningString(long errorID)
  313. {
  314.     if (gNumWarnings == 0)
  315.         gNumWarnings = build_lookup(gWarningLookup);
  316.  
  317.     return lookup(gWarningLookup, gNumWarnings, errorID);
  318. }
  319.  
  320. char *getNoticeString(long errorID)
  321. {
  322.     if (gNumNotices == 0)
  323.         gNumNotices = build_lookup(gNoticeLookup);
  324.  
  325.     return lookup(gNoticeLookup, gNumNotices, errorID);
  326. }
  327.